Springboot中使用RestTemplate(一种更为优雅的调用RESTful服务的方式)

您所在的位置:网站首页 springboot resttemplate上传将文件值传到另一接口 Springboot中使用RestTemplate(一种更为优雅的调用RESTful服务的方式)

Springboot中使用RestTemplate(一种更为优雅的调用RESTful服务的方式)

2024-07-06 18:44| 来源: 网络整理| 查看: 265

背景

我们在开发java后端的时候,多多少少会遇到一些需要接受别人数据的时候,那通常这种情况,对面大多数情况下都会使用HTTP的方式来提供接口。按照之前的开发经验,大多数人会采用apache的HttpClient开发,或者使用OKHTTP开发。但这两种方式,都需要很长一段代码(或者我直接复制一个类过来),代码复杂、还要担心资源回收的问题。

RestTemplate是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

RestTemplate使用 引入RestTemplate

RestTemplate是spring的一个rest客户端,在spring-web这个包下,spring boot的依赖如下

org.springframework.boot spring-boot-starter-web 配置RestTemplate类: package com.deepbluebi.aip.smartoffice.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import org.springframework.http.converter.StringHttpMessageConverter; import java.nio.charset.Charset; /** * 描述: * * @author xxx * @create 2019-07-25-15:55 */ @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory){ RestTemplate restTemplate= new RestTemplate(factory); // 支持中文编码 restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8"))); return restTemplate; } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000);//单位为ms factory.setConnectTimeout(5000);//单位为ms return factory; } }

配置类其实没啥好说的,大家自己看就行,重点就是如何使用restTemplate

RestTemplate使用

下面我们讲几种最常用的方法:

- Get请求:

getForObject 和 getForEntity 这两个方法都是采用get请求去获取数据。 但是 getForObject()其实比getForEntity()多包含了将HTTP转成POJO的功能,但是getForObject没有处理response的能力。因为它拿到手的就是成型的pojo。省略了很多response的信息。 getForEntity 我们可以看到 getForEntity提供了三个方法。 第二个很简单,对应的参数:一个是url地址 ,一个是返回的实体类。 第一个方法 第三个参数是对应的url中带的参数。(不是很懂,所以不常用) 第三个方法(常用):url参数是个Map类。 例子:

String url = "http://www.xxxx.com?userId={userId}&begin={begin}&end={end}"; Map map = new HashMap(); map.put("userId", "1"); map.put("begin", "1"); map.put("end", "10"); restTemplate.getForEntity(url, ResponseBean.class,map);

getForObject 和getForEntity 差不都,不多介绍了。 这里还得注重介绍下getForEntity 返回的ResponseEntity 这个类:

ResponseEntity response = restTemplate.getForEntity(url, ResponseBean.class,map); response.getHeaders(); //响应头 response.getStatusCode(); //响应码 response.getBody(); //响应体,就是返回内容 - POST请求:

post请求应该是比GET请求还要常用的方法:最常见的就是在post请求中添加 header。 我们先从基本开始看。 POST和GET请求一样也有 postForObject和postForEntity。 post和get的区别就是 post 是把发送的内容放到body里面。那么我们需要先构建body类。也就是 HttpEntity HttpEntity 我们可以看到HttpEntity有三个构造方法。其中需要注意的是第三个构造方法,其实也很好理解,MultiValueMap 也就使header。 举个例子:

String url = "http://www.xxxx.com"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap map= new LinkedMultiValueMap(); map.add("userId", "3212xxxxxxxxxxxxxx"); HttpEntity request = new HttpEntity(map, headers); ResponseEntity response = restTemplate.postForEntity( url, request , String.class ); System.out.println(response.getBody());

包括返回数据乱码都可以在 header中指定返回类型

通用的exchange 方法:

exchange()方法跟上面的方法不同之处在于它可以指定请求的HTTP类型。 exchange方法有以下几种: 在这里插入图片描述 感觉挺多的,我就不一一介绍了 -。- 举个例子:

String yesterdayDate = DateUtil.getPreDateByDate(new Date()); HttpHeaders headers = new HttpHeaders(); headers.add("X-API-KEY", XAPIKEY); headers.add("X-API-SECRET ", XAPISECRET); HashMap map = new HashMap(); map.put("edge_channel", edgcChannel); map.put("time_begin", yesterdayDate); map.put("time_end", yesterdayDate); map.put("page_size", pageSize); map.put("page_num", String.valueOf(pageNum)); HttpEntity httpEntity = new HttpEntity(null, headers); ResponseEntity result = restTemplate.exchange(passRecordUrl, HttpMethod.GET, httpEntity 总结:

从去年到今年隔了有一年才开始更新博客了,去年那个时候也是正好换工作的时候 ,所以忙着换工作也没时间更新,后来找到工作了,刚上班也比较忙,没啥时间来更新(其实就是懒=。=)。最近恢复更新,嘻嘻。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3